import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;

/**
 * @Name: LogController
 * @Description: 程序员应该如何正确的打印日志
 * @Author: Mr.Tong
 */
@Slf4j
public class LogController {


    /**
     * @Description: 1、日志级别
     * @Author: Mr.Tong
     */
    public void logLevel() {
        log.error("这个错误很严重，业务主流程被阻断，打日志，记监控，发报警");
        log.warn("这个错误不应该出来，业务主流程可以继续往下走，但是向程序员发出警告");
        log.info("没啥错误，就想打印个信息");
        log.debug("开发联调阶段，多打点日志很合理，业务上线之后，不应该再有debug日志，仅限于开发联调阶段");
        log.trace("据说是为了追踪");

        // 正确打印debug
        if (log.isDebugEnabled()) {
            log.debug("不想被开除，最好按照标准的打印日志！🔥");
        }

        try {
            // 该业务很重要，出错影响了主流程，应该记录下error信息
            String orderDetail = getOrderDetail();
        } catch (Exception e) {
            log.error("getOrderDetail error:", e);
        }

        try {
            // 该业务不是很重要，出错不会影响主流程，应该记录下warn信息
            String revenue = getRevenue();
        } catch (Exception e) {
            log.warn("getRevenue warn:", e);
        }

    }


    /**
     * @Description: 一个很重要的业务逻辑
     * @Author: Mr.Tong
     */
    private String getOrderDetail() {
        return "订单详细信息";
    }


    /**
     * @Description: 一个不是很重要的业务逻辑
     * @Author: Mr.Tong
     */
    private String getRevenue() {
        return "订单结算信息";
    }


    /**
     * @Description: 2、在一个业务例子中正确的打日志
     * @Author: Mr.Tong
     */
    public Object log(JsonObject request) {
        log.info("log() called with parameters => [request = {}]", request);

        Boolean isVip = Boolean.TRUE;
        if (isVip) {
            log.info("vip biz");
        } else {
            log.info("not vip biz");
        }

        log.info("callRemote start");
        String result = callRemote();
        log.info("callRemote ret:{}", result);

        try {
            getOrderDetail();
        } catch (Exception e) {
            log.error("getOrderDetail error:", e);
        }

        Object response = new Object();
        log.info("log() returned: {}", response);
        return response;
    }

    /**
     * @Description: 一个远程过程调用
     * @Author: Mr.Tong
     */
    private String callRemote() {
        return "远程调用结果";
    }

}
